// import store from '@/store'
export default class WSocket {
  ws = null // WebSocket实例
  lockReconnect = false // 是否重新连接
  timer = null // 重新连接的计时器
  timeout = null // 心跳计时器
  url = ''
  constructor(url) {
    this.url = url // WebSocket连接的url地址
    this.initWebSocket()
  }

  // 初始化websocket
  initWebSocket() {
    // WebSocket与普通的请求所用协议有所不同，ws等同于http，wss等同于https
    this.url = this.url.replace('https://', 'wss://').replace('http://', 'ws://')
    // url = store.user.token ? url + '&token=' + store.user.token : url // 添加token
    this.ws = new WebSocket(this.url)
    this.onError()
    this.onClose()
    this.onOpen()
    // this.onMessage()
    this.lockReconnect = false
  }

  onOpen(callback) {
    this.ws.onopen = () => {
      // console.log('WebSocket连接成功')
      callback && callback()
      this.reset()
    }
  }

  onMessage(callback) {
    this.ws.onmessage = e => {
      // console.log('获取WebSocket数据')
      callback && callback(e)
      this.reset()
    }
  }

  onError() {
    this.ws.onerror = () => {
      // console.log('WebSocket连接失败,WebSocket重新连接')
      this.reconnect()
    }
  }

  onClose() {
    this.ws.onclose = () => {
      // console.log('连接意外关闭后,WebSocket重新连接')
      this.reconnect()
    }
  }

  // 手动关闭WebSocket连接
  closeWebSocket() {
    // console.log('WebSocket连接手动关闭')
    this.ws.close()
    this.lockReconnect = true
    if (this.timer) clearTimeout(this.timer)
  }

  // 重新连接（没连接上会一直重连，设置延迟避免请求过多）
  reconnect() {
    if (this.lockReconnect) return
    this.lockReconnect = true
    if (this.timer) clearTimeout(this.timer)
    this.timer = setTimeout(() => {
      console.info('尝试重连...')
      this.initWebSocket()
      this.lockReconnect = false
    }, 5000)
  }

  // 重置心跳（由于网络以及websocket自身的一些不稳定性，页面长时间打开的情况下有时会发生websocket链接的断开，为了防止这种情况，我们增加心跳检测机制(每30s心跳一次)）
  reset() {
    clearTimeout(this.timeout)
    this.start()
  }

  // 开启心跳
  start() {
    this.timeout && clearTimeout(this.timeout)
    this.timeout = setTimeout(() => {
      // 这里发送一个心跳，后端收到后，返回一个心 跳消息(如果连接正常,发送一个信息；否则重连)
      this.ws.readyState === 1 ? this.ws.send('heartCheck') : this.reconnect()
    }, 30000)
  }
}
